package com.songlanyun.modules.order.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.math.BigDecimal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.songlanyun.common.drive.RootEntity;
import com.songlanyun.common.enums.GoodsConstant;
import com.songlanyun.common.enums.OrderConstant;
import com.songlanyun.common.utils.SpringContextUtils;
import com.songlanyun.common.utils.custom.DateCustomUtils;
import com.songlanyun.modules.order.service.ChildOrderServiceItemService;
import com.songlanyun.modules.order.service.OrderReceiptService;
import com.songlanyun.modules.order.service.SaleServiceGoodsCardService;
import com.songlanyun.modules.rabbitmq.util.SpringContextUtil;
import com.songlanyun.modules.servicegoods.entity.ServiceItem;
import com.songlanyun.modules.servicegoods.service.ServiceItemService;
import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 销售系统中的子订单
 *
 * @author lubo
 * @email sunlightcs@gmail.com
 * @date 2020-11-16 14:14:42
 */
@Data
@TableName("yxt_sale_child_order")
public class ChildOrder extends RootEntity<Long, ChildOrder> implements Serializable {
    private static final long serialVersionUID = 1L;

    {
        useStatus = OrderConstant.UseStatus.NO_USE;
        firstCategoryId = 0L;
        goodsCategoryId = 0L;
    }

    /**
     *
     */
    @TableId
    private Long id;
    /**
     * 所属店铺
     */
    @NotNull(message = "所属店铺不能为空")
    private Long shopId;
    /**
     * 订单来源商家店铺id
     */
    @NotNull(message = "订单来源商家店铺id不能为空")
    private Long sourceShopId;
    /**
     * 订单来源商家店铺名称
     */
    @NotBlank(message = "所属店铺名称不能为空")
    private String sourceShopName;
    /**
     * 出货方式（0物流，1自提）
     */
    private OrderConstant.ShipmentMode shipmentMode;


    /**
     * 聚合支付订单号
     */
    @NotBlank(message = "聚合支付订单号不能为空")
    private String payOrderCode;


    /**
     * 聚合支付订单id
     */
    @NotNull(message = "聚合支付订单id不能为空")
    private Long payOrderId;


    /**
     * 下单会员id
     */
    @NotNull(message = "下单会员不能为空")
    private Long userId;
    /**
     * 所属订单id
     */
    @NotNull(message = "所属订单id不能为空")
    private Long orderId;
    /**
     * 主订单编号
     */
    @NotBlank(message = "主订单编号不能为空")
    private String orderCode;
    /**
     * 所属商品id
     */
    @NotNull(message = "所属商品id不能为空")
    private Long goodsId;
    /**
     * 商品标题
     */
    @NotBlank(message = "商品标题不能为空")
    private String goodsTitle;
    /**
     * 商品短标题
     */
    private String shortGoodsTitle;
    /**
     * 商品图片
     */
    @NotBlank(message = "商品图片不能为空")
    private String goodsImg;
    /**
     * 营销活动内类型(0无活动，1秒杀，2拼团）
     */
    private Integer marketingType;
    /**
     * 活动id
     */
    private Long activityId;
    /**
     * 活动标题
     */
    private String activityTitle;
    /**
     * 活动发起信息id(如果是限时折扣和首单优惠活动，其为0，如果是拼团其为发起的团Id
     */
    private Long sponsorActivityId;

    /**
     * 活动商品
     */
    private Long activityGoodsId;
    /**
     * 商品规格编码
     */
    private String skuBarCode;
    /**
     * 规格的Hash编码，方便去对应和查找
     */
    private String skuHashCode;
    /**
     * 规格集的文本显示值
     */
    private String skuSetName;
    /**
     * 单品标识
     */
    private Long singleGoodsId;
    /**
     * 单品标题
     */
    private String singleGoodsTitle;
    /**
     * 单品编号
     */
    private String singleGoodsCode;
    /**
     * 购买商品规格数量
     */
    @Min(value = 1, message = "购买商品规格数量最小是1")
    private Integer number;
    /**
     * 已收货数量
     */
    private Integer receiptedNum;
    /**
     * 发货数量
     */
    private Integer shipNum;
    /**
     * 交易状态交易状态（0已下单,待支付，1待发货（待备货），2,"部分发货",3,"待收货（待自提）"，4,"部分收货",5交易完成,6关闭
     */
    private OrderConstant.TransactionStatus transactionStatus;
    /**
     * 0未支付，1支付已提交,2支付成功，但业务发生异常需要发起退款，3支付成功，但业务发生异常自动退款成功，4支付成功，但业务发生异常自动退款失败，9支付失败，10已支付(已支付成功)
     */
    private OrderConstant.PaymentStatus paymentStatus;
    /**
     * 0未发货，1部分发货，2已发货
     */
    private OrderConstant.ShipStatus shipStatus;
    /**
     * 0，未收货，1部分收货，2已收货
     */
    private OrderConstant.ReceiptStatus receiptStatus;

    /**
     * 0用户未评，1用户部分已评，2全部已评
     */
    private OrderConstant.CommentStatus commentStatus;


    /**
     * 0未自提,1核销确认自提
     */
    private Boolean selfTakeOperate;
    /**
     * 单位
     */
    private String unit;

    /**
     * 最终实际价格（可以在原实际价格上面改价）
     * 下单时 realPrice = originalRealPrice
     * 改价后 realPrice < originalRealPrice
     */
    private BigDecimal realPrice;

    /**
     * 原来的实际价格（会员打折或秒杀的实际价格或活动价）
     */
    private BigDecimal originalRealPrice;

    /**
     * 原规格销售价
     */
    private BigDecimal salePrice;
    /**
     * 总实际价格 实际商品总费用
     */
    private BigDecimal totalRealPrice;

    /**
     * 原商品总价
     */
    private BigDecimal originalGoodsAmount;

    /**
     * 总优惠多少钱
     */
    private BigDecimal totalReduced;

    /**
     * 首单优惠分摊多少钱
     */
    private BigDecimal firstOrderReduced;

    /**
     * 单位成本
     */
    private BigDecimal cost;
    /**
     * 总成本
     */
    private BigDecimal totalCost;


    /**
     * 单位重量
     */
    private BigDecimal weight;
    /**
     * 总的重量
     */
    private BigDecimal totalWeight;
    /**
     * 单位体积
     */
    private BigDecimal volume;
    /**
     * 总体积
     */
    private BigDecimal totalVolume;
    /**
     * 实际计算得到的物流费用
     */
    private BigDecimal shouldFreight;


    /**
     * 单件兑换积分
     */
    private BigDecimal exchangePoint;
    /**
     * 实际兑换积分
     */
    private BigDecimal totalPoint;

    /**
     * 单件需要赠送多少
     */
    private BigDecimal giveBackPoint ;

    /**
     * 单件需要赠送多少贡献值
     */
    private BigDecimal consumptionValue= BigDecimal.ZERO ;


    /**
     * 总共需要赠送多少贡献值
     */
    private BigDecimal totalConsumptionValue= BigDecimal.ZERO ;

    /**
     * 总共需要赠送多少爱心值
     */
    private BigDecimal totalGiveBackPoint;

    /**
     * 0不是积分兑换订单，1积分兑换订单
     */
    private Boolean exchange;
    /**
     * 发货时间(时间戳)
     */
    private Long shipTime;

    public void setShipTime(Long shipTime) {
        this.shipTime = shipTime;
        this.formatShipTime = DateCustomUtils.formatToDateTimeString(shipTime);
    }

    /**
     * 发货时间
     */
    @TableField(exist = false)
    private String formatShipTime;

    /**
     * 实际的收货时间(时间戳)
     */
    private Long factReceiptTime;

    public void setFactReceiptTime(Long factReceiptTime) {
        this.factReceiptTime = factReceiptTime;
        this.formatFactReceiptTime = DateCustomUtils.formatToDateTimeString(factReceiptTime);
    }

    /**
     * 实际的收货时间
     */
    @TableField(exist = false)
    private String formatFactReceiptTime;

    /**
     * 必须的最后的子订单封闭时间(时间戳)，到时自动封闭子订单
     */
    private Long lastEndTime;

    public void setLastEndTime(Long lastEndTime) {
        this.lastEndTime = lastEndTime;
        this.formatLastEndTime = DateCustomUtils.formatToDateTimeString(lastEndTime);
    }

    /**
     * 必须的最后的子订单封闭时间，到时自动封闭子订单
     */
    @TableField(exist = false)
    private String formatLastEndTime;
    /**
     * 必须的最后的评论时间,(时间戳)到时自动评论
     */
    private Long lastCommentTime;

    public void setLastCommentTime(Long lastCommentTime) {
        this.lastCommentTime = lastCommentTime;
        this.formatLastCommentTime = DateCustomUtils.formatToDateTimeString(lastCommentTime);
    }

    /**
     * 必须的最后的评论时间,到时自动评论
     */
    @TableField(exist = false)
    private String formatLastCommentTime;
    /**
     * 实际的评论时间(时间戳)
     */
    private Long factCommentTime;

    public void setFactCommentTime(Long factCommentTime) {
        this.factCommentTime = factCommentTime;
        this.formatFactCommentTime = DateCustomUtils.formatToDateTimeString(factCommentTime);
    }

    /**
     * 实际的评论时间
     */
    @TableField(exist = false)
    private String formatFactCommentTime;

    /**
     * 0下单减库存，1支付减库存
     */
    private OrderConstant.StockDeductMode stockDeductMode;


    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    /**
     *
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 会员手机号
     */
    private String mobile;
    /**
     * 是否是代销订单
     */
    private Boolean proxy;

    /**
     * 是否关闭（封单也是一种关闭）
     */
    private Boolean end;

    /**
     * 0没有，1仅退款,2退款退货
     */
    private OrderConstant.RightsType rightsType;
    /**
     * 订单的维权状态（0没有，1维权中，2完成）
     */
    private OrderConstant.RightsStatus rightsStatus;

    /**
     * 是否是平台的代销商品
     */
    private Boolean proxyGoods;

    /**
     * 礼包类型
     */
    private GoodsConstant.GiftType giftType;

    /**
     * 订单类型（0充值 1消费订单，2服务订单）
     */
    private OrderConstant.OrderType orderType;


    /**
     * 0未使用，1部分已使用，2已全部使用
     */
    private OrderConstant.UseStatus useStatus;


    /**
     * 商品分区特征(0普通商品,1激活区商品)
     */
    private GoodsConstant.AreaFeature areaFeature;


    /**
     * 服务卡
     */
    @TableField(exist = false)
    private SaleServiceGoodsCard serviceCard;

    public SaleServiceGoodsCard loadServiceCard()
    {
        SaleServiceGoodsCardService service = (SaleServiceGoodsCardService) SpringContextUtil.getBean("saleServiceGoodsCardService");
        if(serviceCard == null)
        {
            serviceCard  = service.loadOrderIdAndChildOrder(this.getOrderId(),this.getId());
        }
        return serviceCard;
    }

    /**
     * 如果是普通商品，是普能商品一级分类，如果是服务商品，是服务商品一级分类（记录只为做数据统计）
     */
    private Long firstCategoryId;

    /**
     * 如果是普通商品，是普能商品引用的商品分类，如果是服务商品，是服务商品引用的商品分类（记录只为做数据统计）
     */
    private Long goodsCategoryId;

    /**
     * 分享人（会员id）
     */
    private Long shareUserId;


    /**
     * 店铺券分摊多少钱
     */
    private BigDecimal shopCouponSharing = BigDecimal.ZERO;


    /**
     * 平台券分摊多少钱
     */
    private BigDecimal platformCouponSharing = BigDecimal.ZERO;

    /**
     * 平台公益积分现金分摊多多少钱
     */
    private BigDecimal platformPointZxSharing = BigDecimal.ZERO;


    /**
     * 第三方商品的SpuId;
     */
    private Long thirdSpuId;

    /**
     *  是否是第三方商品
     */
    private Boolean third;

    /**
     * 如果是第三方商品，来源有效
     * 来源1云仓2京东6阿里巴巴7天猫11华南一仓14华东一仓15淘宝
     */
    private Integer source;

    /**
     * 第三方商品的SkuId;
     */
    private Long thirdSkuId;

    /**
     * 第三方 候鸟 订单号
     * @return
     */
    private String thirdOrderNo;

    /**
     * 候鸟商品号
     * @return
     */
    private String thirdHouniaoSpuId;

    @Override
    public Long getIdentity() {
        return getId();
    }
}
